介绍
Apache Phoenix项目由saleforce开源并贡献给Apache基金会,目前为Apache基金会的顶级项目。它是构建在HBase上的SQL中间层。 Phoenix会将用户编写的sql查询编译为一系列的scan操作,最终产生通用的JDBC结果集返回给客户端,小范围的查询可做到毫秒级响应,千万数据的响应速度为秒级。
引子
最近在不断给公司大数据平台添加新组件,这次是Phoenix,这个组件的一大吸引力是为hbase提供二级索引的功能。关于Phoenix的架构和功能介绍,网上文档有很多,这里就不班门弄斧了。这里主要记录一下组件添加过程中遇到的难点吧。
首先遇到的问题就是版本问题,目前公司这边大数据平台的hbase版本有三个可选项
- hbase-1.0-cdh5.4.4
- hbase-1.2-cdh5.8
- hbase-1.2-cdh5.13.3
Phoenix本身的部署是很简单的,将Phoenix server的jar包拷贝到hbase的lib目录下, 然后重启hbase服务就好。从Phoenix官网下载到Phoenix包大多是apache版本的,只有少量的cdh版本有二进制包发布,开始抱着侥幸心理,直接把apache版本的jar包拷贝到hbase lib目录下,发现是不行的。查了下Google和stackoverflow,发现最好的办法就是自己手动去编译了,很庆幸找到了github已经有外国大大搞好了库(链接),然后,我就下载对应版本的包,配置好java和maven环境,跟着指导完成了编译工作。
然后再从Phoenix官网下载apache版本的二进制包,并将保重的jar包删除,将上一步自己编译出的全部jar包拷贝进来,如此,三个版本的phoenix包就制作完成了。
使用
在完成Phoenix的安装后,进入Phoenix客户端目录,使用命令行工具:
选择集群master或者core节点,进入客户端目录
1
2# 这里我们选择master1节点
cd /home/hadoop/phoenix/bin使用Phoenix python命令行工具
1 | ./sqlline.py uhadoop-xxx-master1:2181 |
- 使用sql操纵Phoenix表
参考文档:https://phoenix.apache.org/language/index.html#create
tips:
Phoenix会自动将表名和字段名转换为大写字母,如果不想转换的话可以使用双引号把字段或者表名括起来
使用帮助,查看全部Phoenix命令
1
0: jdbc:phoenix> !help
查看table列表
1
0: jdbc:phoenix> !table
创建新表
1 | 0: jdbc:phoenix:> |
插入数据
1
20: jdbc:phoenix:> upsert into test values (1,'uhadoop');
0: jdbc:phoenix:> upsert into test values (2,'phoenix');查看表内容
1 | 0: jdbc:phoenix:> select * from test; |
- 删除表内容
1 | 0: jdbc:phoenix:> delete from test where mykey=1; |
- 为表创建索引
1 | 0: jdbc:phoenix:> create local index test_idx on test(mycolumn); |
- 查看表的索引信息
1 | 0: jdbc:phoenix:> !indexes test |
- 删除表
1 | 0: jdbc:phoenix:> drop table if exists test; |
- 退出客户端
1 | 0: jdbc:phoenix:>!exit |
- 使用Phoenix与已有hbase表建立表映射关系
- 4.1 进入hbase shell命令行创建表并插入数据
1 | [root@uhadoop-xxx-master1 bin]# hbase shell |
- 4.2 进入Phoenix python客户端,建立映射关系
tips:
1.Phoenix 4.10 及以上的版本,Phoenix对列对编码格式有所改变(官网说明文档),所以在建立与hbase映射关系时,需要设置 COLUMN_ENCODED_BYTES 属性为 0,即不让 Phoenix 对 column family 进行编码。
2.HBase数据表默认主键列名是ROW
3.为了防止Phoenix自动将小写column转大写,需要用双引号将column扩起来
4.如果映射关系建立成功,建标之后可以看到有多少行数据被影响
创建表映射
1
20: jdbc:phoenix:> create table "phoenix"("ROW" varchar primary key, "info"."name" varchar) column_encoded_bytes=0;
1 row affected (6.523 seconds)删除表(注意,这里hbase中表也会被同时删除)
1 | 0: jdbc:phoenix:> drop table "phoenix"; |
- 使用Phoenix与已有hbase表建立视图映射关系
如果Phoenix表只是做查询操作对话,做表映射是个更好对选择,做表映射,如果在Phoenix客户端删除表,则hbase中该表也将被删除。 如果是用视图映射,则删除视图不会影响原有表的数据。
- 5.1 创建视图映射
1 | # 如果hbase中不存在phoenix表,需要按照4.1节的方式在hbase中建表 |
- 5.2 查询视图
1 | 0: jdbc:phoenix:>select * from "phoenix"; |
- 5.3 删除视图
1 | 0: jdbc:phoenix:> drop view "phoenix"; |
6.使用phoenix自带工具执行sql脚本
- 6.1 创建测试脚本 test.sql
1 | # cd /home/hadoop/phoenix/bin |
- 6.2 执行脚本
1 | # cd /home/hadoop/phoenix/bin |
参考文档:
Phoenix global索引:
https://blog.csdn.net/maomaosi2009/article/details/45600109
Phoenix local索引:
https://blog.csdn.net/maomaosi2009/article/details/45619047